package edu.uci.ics.jung.algorithms.util;

import java.util.HashMap;
import java.util.Map;

/**
 * An simple minimal implementation of <code>Map.Entry</code>.
 *
 * @param <K>
 *            the key type
 * @param <V>
 *            the value type
 */
public class BasicMapEntry<K, V> implements Map.Entry<K, V> {
	final K key;
	V value;

	/**
	 * Create new entry.
	 */
	public BasicMapEntry(K k, V v) {
		value = v;
		key = k;
	}

	@Override
	public K getKey() {
		return key;
	}

	@Override
	public V getValue() {
		return value;
	}

	@Override
	public V setValue(V newValue) {
		V oldValue = value;
		value = newValue;
		return oldValue;
	}

	@Override
	public boolean equals(Object o) {
		if (!(o instanceof Map.Entry)) {
			return false;
		}
		Map.Entry e = (Map.Entry) o;
		Object k1 = getKey();
		Object k2 = e.getKey();
		if (k1 == k2 || (k1 != null && k1.equals(k2))) {
			Object v1 = getValue();
			Object v2 = e.getValue();
			if (v1 == v2 || (v1 != null && v1.equals(v2))) {
				return true;
			}
		}
		return false;
	}

	@Override
	public int hashCode() {
		return (key == null ? 0 : key.hashCode())
				^ (value == null ? 0 : value.hashCode());
	}

	@Override
	public String toString() {
		return getKey() + "=" + getValue();
	}

	/**
	 * This method is invoked whenever the value in an entry is overwritten by
	 * an invocation of put(k,v) for a key k that's already in the HashMap.
	 */
	void recordAccess(HashMap<K, V> m) {
	}

	/**
	 * This method is invoked whenever the entry is removed from the table.
	 */
	void recordRemoval(HashMap<K, V> m) {
	}
}
